// 缓存
class Cache {

    setCacheType = 'localStorage' // sessionStorage localStorage

    constructor() { }

    /**
     * @param {String} key 要获取缓存的key
     * @param {Function} fn 拿到缓存后的回调
     *      fn @param {Boolean, *} cache 如果过期或不存在 返回null
     */
    getCache(key, fn = () => { }) {
        let data = window[this.setCacheType].getItem(key)
        // 未找到缓存
        if (data === null) return fn(data)

        // time = 0 说明不设过期时间
        let { time, data: cache } = JSON.parse(data) || {}
        let nowTimeStamp = new Date().getTime()
        // 缓存过期了
        if (time && nowTimeStamp > time) cache = null

        fn(cache)
    }

    /**
     * getCache promise版本
     */
    getCacheSync(key) {
        return new Promise((resolve, reject) => {
            let data = window[this.setCacheType].getItem(key)
            // 未找到缓存
            if (data === null) reject(data)

            // time = 0 说明不设过期时间
            let { time, data: cache } = JSON.parse(data) || {}
            let nowTimeStamp = new Date().getTime()
            // 缓存过期了
            if (time && nowTimeStamp > time) cache = null

            resolve(cache)
        })
    }

    /**
     * @param {String} key 要设置缓存的key
     * @param {*} val 要缓存的值
     * @param {Number} time 设置过期的时间（单位毫秒） [可选]
     * @param {Function} fn 设置缓存后的回调 [可选]
     */
    setCache(key, val, time = null, fn = () => { }) {
        // time 没传
        if (util.isType(time, 'Function')) {
            fn = time
            time = null
        }

        let nowTimeStamp = new Date().getTime()

        let obj = {
            time: util.isType(time, 'Number') ? nowTimeStamp + time : null, // 过期时间
            data: val, // 可被json化的数据
        }
        window[this.setCacheType].setItem(key, JSON.stringify(obj))
        fn()
    }

    /**
     * 删除单个缓存
     * @param {String} key 要删除的key
     * @param {Function} fn
    */
    removeCache(key, fn = () => { }) {
        window[this.setCacheType].removeItem(key)
        fn()
    }

    /**
     * 清除全部缓存
     * @param {Function} fn
     */
    clearCache(fn = () => { }) {
        window[this.setCacheType].clear()
        fn()
    }
}